package com.updesignsz.commom.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * 日期工具类 2016-08-21
 */
public class DateUtil {
	
	/**
	 * 获取当天时间
	 * 【按传入参数格式返回】
	 */ 
	public static String getNowTime(String dateformat) {
		Date now = new Date();
		SimpleDateFormat dateFormat = null;
		String hehe = null;
		try {
			dateFormat = new SimpleDateFormat(dateformat);// 可以方便地修改日期格式
			hehe = dateFormat.format(now);
		} catch (Exception e) {
			dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 可以方便地修改日期格式
			hehe = dateFormat.format(now);
		}
		return hehe;
	}
	
	/**
	 * 获取七天之前(以当前时间为参照)的时间
	 * 【按传入参数格式返回】
	 * @return
	 */
	public static String getBefore7DaysTime(String dateformat){
		Calendar cd = Calendar.getInstance();
		cd.add(Calendar.DATE, -7);
		return new SimpleDateFormat(dateformat).format(cd.getTime());
	}
	
	
	/**
	 * 获取指定时间指定日期
	 * 【按传入参数格式返回】
	 * @return
	 */
	public static String getDaysTime(String dateformat,int day){
		Calendar cd = Calendar.getInstance();
		cd.add(Calendar.DATE, day);
		return new SimpleDateFormat(dateformat).format(cd.getTime());
	}

	/**
	 * 获取指定时间指定日期
	 * @return
	 */
	public static Date getDayHourTime(Date date, int hour){
		Calendar cd = Calendar.getInstance();
		cd.setTime(date);
		cd.add(Calendar.HOUR_OF_DAY, -hour);
		return cd.getTime();
	}

	/**
	 * 获取指定时间指定日期
	 * 【按传入参数格式返回】
	 * @return
	 */
	public static String getDaysTime(String date, String dateformat,int day){
		Calendar cd = Calendar.getInstance();
		cd.setTime(getStrByDataTime(date, dateformat));
		cd.add(Calendar.DATE, day);
		return new SimpleDateFormat(dateformat).format(cd.getTime());
	}
	
	public static String getBeforeNDaysTime(int num,String date,String dateformat)
	{
		Calendar dayc1 = new GregorianCalendar();
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		Date daystart;
		try {
			daystart = format.parse(date);
			dayc1.setTime(daystart);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		dayc1.add(Calendar.DATE, -num);
		return new SimpleDateFormat(dateformat).format(dayc1.getTime());
	}
	
	/**
	 * 获取N天之前(以当前时间为参照)的时间
	 * @param num
	 * @param dateformat
	 * @return
	 */
	public static String getBeforeNDaysTime(int num,String dateformat){
		Calendar cd = Calendar.getInstance();
		cd.add(Calendar.DATE, -num);
		return new SimpleDateFormat(dateformat).format(cd.getTime());
	}
	
	/**
	 * 获取本月第一天的日期
	 * @return
	 */
	public static String getFirstDayToCurMonth(){
		Date date = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
		String currentDate = format.format(date);
		StringBuffer sb = new StringBuffer(currentDate);
		sb.append("-01");
		return sb.toString();
	}
	
	/**
	 * 获取本月第一天的日期(给到秒)
	 * @return
	 */
	public static String getFirstDayForTime(){
		String firTime = getFirstDayToCurMonth();
		StringBuffer str = new StringBuffer(firTime);
		str.append(" 00:00:00");
		return str.toString();
	}
	
	/**
	 * 获取昨天的日期
	 * @return
	 */
	public static String getYesterDayDate(){
		Calendar cd = Calendar.getInstance();
		cd.add(Calendar.DATE, -1);
		return new SimpleDateFormat("yyyy-MM-dd").format(cd.getTime());
	}
	
	/**
	 * 获取昨天的日期(给到秒)
	 * @return
	 */
	public static String getYesterDayTime(){
		String yesTime = getYesterDayDate();
		StringBuffer str = new StringBuffer(yesTime);
		str.append(" 23:59:59");
		return str.toString();
	}
	
	/**
	 * 返回指定日期的前一天日期
	 * @param dateParam
	 * @return
	 */
	public static Date getYesterByDate(Date dateParam){
		Calendar c = Calendar.getInstance();
		c.setTime(dateParam);
		int day = c.get(Calendar.DATE);
		c.set(Calendar.DATE, day-1);
		return c.getTime();
	}
	
	/**
	 * 返回指定日期的前一天日期
	 * @param dateParam
	 * @return
	 */
	public static String getYesterByDate(String dateParam){
		SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = getYesterByDate(sd.parse(dateParam));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}
	
	
	/**
	 * 返回指定日期的前N天日期
	 * @param dateParam
	 * @return
	 */
	public static String getDateBefore(String dateParam,int num){
		SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			//date = getYesterByDate(sd.parse(dateParam));
			
			Calendar c = Calendar.getInstance();
			c.setTime(sd.parse(dateParam));
			int day = c.get(Calendar.DATE);
			c.set(Calendar.DATE, day-(num-1));
			date=c.getTime();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}
	
	/**
	 * 返回时间戳 
	 * @param user_time 字符串格式yyyy-MM-dd 年月日
	 * @return
	 */
	public static int getTime(String user_time) { 
		String re_time = null;  
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
		Date d; 
		try { 
		d = sdf.parse(user_time); 
		long l = d.getTime(); 
		String str = String.valueOf(l); 
		re_time = str.substring(0, 10); 
		} catch (ParseException e) { 
		// TODO Auto-generated catch block 
		e.printStackTrace(); 
		} 
		return  Integer.parseInt(re_time); 
	}


	/**
	 * 返回时间戳
	 * @param time 字符串格式yyyy-MM-dd 年月日
	 * @return
	 */
	public static long getLongTime(String time) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date d = sdf.parse(time);
			return d.getTime();
		} catch (ParseException e) {
		// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}
	}

	/**
	 * 返回时间戳
	 * @param time 字符串
	 * @param dateformat 字符串格式
	 * @return
	 */
	public static long getLongTime(String time, String dateformat) {
		if (StringUtil.isNull(dateformat)) dateformat = "yyyy-MM-dd ";
		SimpleDateFormat sdf = new SimpleDateFormat(dateformat);
		try {
			Date d = sdf.parse(time);
			return d.getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}

	/**
	 * <h1>获取时间到日期</h1>
	 * 说明：如果参数为null，则返回当天日期
	 * @param date
	 * @return 格式：2012-01-05
	 */
	public static String getDateByDay(Date date) {
		if(date == null)
			date = new Date();
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}


	/**
	 * <h1>获取时间到日期</h1>
	 * 说明：如果参数为null，则返回当天日期
	 * @param date
	 * @return 格式：2012-01-05 11:12:13
	 */
	public static String getDateByDays(Date date) {
		if(date == null)
			date = new Date();
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
	}

	/**
	 * 字符串日期转换
	 * @param dateStr 要转换的日期
	 * @param formatFrom 转前格式
	 * @param formatTo 转后格式
	 * @return
	 */
	public static String dateStrConvert(String dateStr,String formatFrom,String formatTo){
		if(StringUtil.isNull(dateStr))
			return "";
		DateFormat sdf= new SimpleDateFormat(formatFrom);
		Date date=null;
		try {
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new SimpleDateFormat(formatTo).format(date);
	}

	/**
	 * 获取当前时间
	 * @param type 格式,例如：yyyyMMddHHmmss，不传参数默认为：yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getDateTimeStr(String... type) {
		String ss = "yyyy-MM-dd HH:mm:ss";
		if(type.length > 0) ss = type[0];
		return new SimpleDateFormat(ss).format(new Date());
	}

	/**
	 * 获取昨天时间
	 * @param type 格式,例如：yyyyMMddHHmmss，不传参数默认为：yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getDateTimeYesterDayStr(String... type) {
		String ss = "yyyy-MM-dd HH:mm:ss";
		if(type.length > 0) ss = type[0];
		Calendar   cal   =   Calendar.getInstance();
		cal.add(Calendar.DATE,   -1);
		return new SimpleDateFormat(ss).format(cal.getTime());
	}


	/**
	 * 字符串转换到日期时间格式
	 * @param dateStr 需要转换的字符串
	 * @param formatStr 需要格式的目标字符串  举例 yyyy-MM-dd
	 * @return Date 返回转换后的时间
	 * @throws ParseException 转换异常
	 */
	public static Date strToDate(String dateStr, String formatStr){
		DateFormat sdf= new SimpleDateFormat(formatStr);
		Date date=null;
		try {
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}


	/**
	 * 比较两个时间的相差值（d1与d2）
	 * @param d1 时间一
	 * @param d2
	 * @param type 类型【d/h/m/s】
	 * @return d1 - d2
	 */
	public static long compareDate(Date d1, Date d2, char type) {
		long num = d1.getTime() - d2.getTime();
		num/=1000;
		if('m' == type){
			num/=60;
		}else if ('h' == type) {
			num/=3600;
		}else if ('d' == type) {
			num/=3600;
			num/=24;
		}
		return num;
	}


	/**
	 * 根据参照时间获取相差天、小时数的新时间
	 * @param date		参照时间
	 * @param type		天或小时[d/h]
	 * @param num		差值，例如：2表示之后2天或小时，-2表示之前2天或小时
	 * @return
	 */
	public static Date getNextDay(Date date, char type, int num) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		switch (type) {
			case 'd':
				calendar.add(Calendar.DAY_OF_MONTH, num);
				break;
			case 'h':
				calendar.add(Calendar.HOUR_OF_DAY, num);
				break;
			default:
				break;
		}
		date = calendar.getTime();
		return date;
	}


	/** 获取当前时间戳  **/
	public static String getTimeStamp() {
		String timeStamp = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
		return timeStamp;
	}


	/** 获得本周第一天时间(yyyy-MM-dd) **/
	public static String getMonOfWeek(){
//		Calendar c = new GregorianCalendar();
//		c.setFirstDayOfWeek(Calendar.MONDAY);
//		c.setTime(new Date());
//		c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());

		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_WEEK, c.getActualMinimum(Calendar.DAY_OF_WEEK));

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String str = sdf.format(c.getTime());
		return str;
	}



	public static Date getDateByDay(Date data, int day){
		Calendar cal = Calendar.getInstance();
		cal.setTime(data);
		cal.add(Calendar.DATE, day);
		return cal.getTime();
	}


	/** 获得本周的最后一天(yyyy-MM-dd) **/
	public static String getSunOfWeek(){
//		Calendar c = new GregorianCalendar();
//		c.setFirstDayOfWeek(Calendar.MONDAY);
//		c.setTime(new Date());
//		c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6);

		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_WEEK, c.getActualMaximum(Calendar.DAY_OF_WEEK));

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String str = sdf.format(c.getTime());
		return str;
	}

	/**
	 * 获得当月的第一天
	 * 默认(yyyy-MM-dd)
	 * @param formatStr 需要格式的目标字符串  举例 yyyy-MM-dd
	 */
	public static String getFirstDayOfMonth(String formatStr){
		if(StringUtil.isNull(formatStr)){
			formatStr = "yyyy-MM-dd";
		}
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		SimpleDateFormat sdf=new SimpleDateFormat(formatStr);
		String str=sdf.format(cal.getTime());
		return str;
	}


	/** 获得当月的第一天(yyyy-MM-dd) **/
	public static String getFirstDayOfMonth(){
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		String str=sdf.format(cal.getTime());
		return str;
	}

	/**
	 * 输入一个月份，获得该月份的第一天
	 * @param date
	 * @return
	 */
	public static String getParamFirstDayOfMonth(String date){
		return getDateTimeByStr(getStrByDataTime(date, "yyyy-MM"), "yyyy-MM-dd");
	}

	/**
	 * 输入一个月份，获得该月份的最后一天
	 * @param date
	 * @return
	 */
	public static String getParamLastDayOfMonth(String date){
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(getDateTimeByStr(getStrByDataTime(date, "yyyy-MM-dd"), "yyyy")));
		cal.set(Calendar.MONTH, Integer.parseInt(getDateTimeByStr(getStrByDataTime(date, "yyyy-MM-dd"), "MM")) - 1);
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		SimpleDateFormat sdfs=new SimpleDateFormat("yyyy-MM-dd");
		String str=sdfs.format(cal.getTime());
		return str;
	}


	/** 获得当月的最后一天(yyyy-MM-dd) **/
	public static String getLastDayOfMonth(){
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		SimpleDateFormat sdfs=new SimpleDateFormat("yyyy-MM-dd");
		String str=sdfs.format(cal.getTime());
		return str;
	}


	/**
	 * 格式化时间，时间转字符串
	 * @param date	null则为当前系统时间
	 * @param format 格式，null则默认为：'yyyy-MM-dd HH:mm:ss'
	 * @return 字符串格式的日期
	 */
	public static String getDateTimeByStr(Date date, String format) {
		if(date == null)
			date = new Date();
		if(format == null)
			format = "yyyy-MM-dd HH:mm:ss";
		return new SimpleDateFormat(format).format(date);
	}


	/**
	 * 格式化时间，字符串转时间
	 * @param dataStr	需要转换的字符串
	 * @param format 	格式，null则默认为：'yyyy-MM-dd HH:mm:ss'
	 * @return	转换的Date
	 */
	public static Date getStrByDataTime(String dataStr, String format) {
		if(dataStr == null)
			return new Date();
		if (format == null)
			format = "yyyy-MM-dd HH:mm:ss";
		DateFormat sdf = new SimpleDateFormat(format);
		Date date = null;
		try {
			date = sdf.parse(dataStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 格式化时间，字符串转时间
	 * @param dataStr	需要转换的字符串
	 * @param format 	格式，null则默认为：'yyyy-MM-dd HH:mm:ss'
	 * @param tomat	 	格式，null则默认为：'yyyy-MM-dd HH:mm:ss'
	 * @return	转换的Date
	 */
	public static String getStrDataTime(String dataStr, String format, String tomat){
		return getDateTimeByStr(getStrByDataTime(dataStr,format), tomat);
	}

	/**
	 * 输入一个日期参数，获得年月
	 * 年月格式:yyyyMM
	 * @param time
	 * @return
	 */
	public static String getYearMonthStr(String time){
		return getStrDataTime(time, "yyyy-MM-dd", "yyyyMM");
	}
	/**
	 * 获得当前时间整点
	 * @return
	 */
	public static Date getIntegralPoint() throws ParseException {
	Calendar calendar = Calendar.getInstance();
	// 分
		calendar.set(Calendar.MINUTE, 0);
	// 秒
		calendar.set(Calendar.SECOND, 0);
		calendar.getTimeInMillis();

		Calendar beijingcal = Calendar.getInstance();
		beijingcal.clear();
		beijingcal.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		beijingcal.setTimeInMillis(calendar.getTimeInMillis());
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String beijingFormatStr = fmt.format(beijingcal.getTime());

		return fmt.parse(beijingFormatStr);
	}


	public static void main(String[] args) throws ParseException {
//		System.out.println("七天前的时间："+getBefore7DaysTime("yyyy-MM-dd"));
//		System.out.println("本月第一天:"+getFirstDayToCurMonth());
//		System.out.println("昨天:"+getYesterDayDate());
//		Date date = new Date();
//		System.out.println("给定日期的前一天:"+getYesterByDate(date));
//		System.out.println("本月第一天(精确到秒):"+getFirstDayForTime());
//		System.out.println("昨天(精确到秒)"+getYesterDayTime());
//
//
//		System.out.println("昨天(精确到秒)"+getBeforeNDaysTime(10,"20130808","yyyy-MM-dd"));
//
//
//		System.out.println(getTime("2013-05-01"));
//
//
//		for(int i=1;i<=15;i++){
//		String value=getDateBefore("2013-09-15",i);
//		value=value.substring(5,7)+"."+value.substring(8,10);
//
//		}
//		System.out.println(getDaysTime("yyyyMMddHHmm",0));
		System.out.println(getIntegralPoint());
	}

}
